#!/home/lin/software/miniconda3/envs/th1.11/bin/python
# -*- coding: utf-8 -*-
import open3d as o3d
import numpy as np
import matplotlib.pyplot as plt

pcd = o3d.io.read_point_cloud("../data/cloud_bin_0.pcd")

'''
给定来自例如深度传感器的点云，我们希望将局部点云群集分组在一起。为此，我们可以使用聚类算法。
Open3D实现了DBSCAN [Ester1996]，它是一种基于密度的聚类算法。
该算法在中实现，cluster_dbscan并且需要两个参数：
    eps定义到聚类中的邻居的距离，并min_points定义形成聚类所需的最小点数。
该函数返回labels，其中标签-1指示噪音。
'''
with o3d.utility.VerbosityContextManager(o3d.utility.VerbosityLevel.Debug)\
        as cm:labels = np.array(pcd.cluster_dbscan(eps=0.02, min_points=10, print_progress=True))

max_label = labels.max()
print(f"point cloud has {max_label + 1} clusters")
colors = plt.get_cmap("tab20")(labels / (max_label if max_label > 0 else 1))
colors[labels < 0] = 0
pcd.colors = o3d.utility.Vector3dVector(colors[:, :3])
o3d.visualization.draw_geometries([pcd])
